提供一个nestjs docker服务器自动编译部署 简单解决方案
目前根据皓哥的视频,写了个nestjs的后端,并部署到阿里云了。发现每次本地修改code,推送后,都要上服务器手动pull,并更新docker很麻烦,后面去查解决方案,发现主要有git hook 和 GitHub webhook 两种方案, 理解原理后,我想能不能向服务器提交请求后自动执行脚本,结果发现是可行的。这样不涉及任何github的设置,只需要加几行code就行了, 实现步骤如下:
1. 配置脚本
在项目目录下建一个脚本,例如:deploy.sh, 输入以下代码:
12月20日更新
向github提交的时候发现服务器自动部署没成功,调用deploy.sh的时候文件路径在根目录下,需要添加一行cd directory, 更改文件路径到存放代码的路径下
#!/bin/bash
cd /你的git存放存放目录
git pull
docker-compose -f production.yml build nest
docker-compose -f production.yml up -d
docker-compose -f production.yml ps
docker-compose -f production.yml logs nest
2.使用 Githook
git仓库和git裸仓库的钩子所在位置不同。
- git普通仓库钩子在.git/hooks/中
- git裸仓库钩子在hooks/中
新建一个 post_service 文件,并设置权限。然后把上方的脚本文件内容复制到 post_service 文件里就可以实现自动监听 git push 操作,然后更新仓库和 docker 了。
cd .git/hooks
mv post_receive.sample post_receive
chmod 777 post-receive
vim post_service
3. 之前的方法:建立一个depoly接口(不安全且每次都要手动发送请求)已弃用
controller:
@Post('deploy')
async deploy() {
return await this.postService.deploy();
}
service:
async deploy() {
const commands = `./deploy.sh`;
return await exec(commands, (err, stdout, stderr) => {
if (err) {
console.error(err);
}
console.log(stdout + stderr);
});
}
Done!
就是这么简单,每次本地修改完code,git push。然后静静等几分钟,docker就自动更新完成了😁。
(p.s 继续改进,没有想到如何查询目前更新的进度,因为docker 更新通常要几分钟。使用接口倒是可以查看日志,只使用 githook + 脚本的无法将进度返回给本地)
参考链接:搭建Git服务器并感受hook使用